package estrategias;

import java.util.List;
import java.util.Vector;

import componentes.Movimiento;
import componentes.Tablero;

public abstract class Estrategia {
	
	boolean sinNorte = false;
	boolean sinSur = false;
	
	public Tablero tablero;
	Movimiento f = Movimiento.FRENTE;
	Movimiento e = Movimiento.ESTE;
	Movimiento o = Movimiento.OESTE;
   
    List<List<Movimiento>> estrategiasSur = new Vector<List<Movimiento>>();
	List<List<Movimiento>> estrategiasNorte = new Vector<List<Movimiento>>();


	
	public Estrategia(){
		setearXEstrategias(9);
	};
	public Estrategia(boolean sinNorte,boolean sinSur){
		this.sinNorte = sinNorte;
		this.sinSur = sinSur;
		setearXEstrategias(9);
	}
	
	protected void setearXEstrategias(int x){
		for(int i=0;i<x;i++){
			estrategiasSur.add(new Vector<Movimiento>());
			estrategiasNorte.add(new Vector<Movimiento>());
		}
	}
	
	public List<Movimiento> getEstrategiaSurNro(int nro){
		return estrategiasSur.get(nro);
	}
	
	public List<Movimiento> getEstrategiaNorteNro(int nro){
		return estrategiasNorte.get(nro);
	}
	
	public void start(){
		//Frame 0
		tablero.print();
		//runneo los threads
		tablero.startJugadores();
	}
	/*
	 *  n =  tamanio 
	 *  t = cantidad de tesoros por equipo 
	 */
	public void crearTablero(int n,int t){
		this.tablero = new Tablero(n,t);
	}
	
	public void agregarMovimiento(List<Movimiento> l, Movimiento... mvs){
		for (int i=0 ; i < mvs.length ; i++)
        	l.add(mvs[i]);
	}

	/**
	 * PRECOND: xys debe ser par
	 * @param xys : x1,y1 , x2,y2 ...
	 */
    public void ponerTesoros(int... xys){
    	//variable solamente para que se entienda mejor el codigo
    	int y;
        for (int x=0 ; x < xys.length ; x += 2) {
        	y = x+1;
        	tablero.ponerTesoro(xys[x],xys[y]);
        }
    }
    
    /***
     *  Mov001
     *  Para equipo SUR
     *  estrategia de movimiento, 
     *  ubicacion barrera
     *  subir por el este gusano 
     *  barrido oeste
     *  Para equipo NORTE
     *  idem en espejo
     *  
     */

    public void ponerExpSurMov001(int cantidad){
    	int n=this.tablero.getSize();	
    	for(int i=0;i<cantidad;i++){
    		List<Movimiento> movs = generarMovimientosParaMov001S(i+1,cantidad);
    		tablero.ponerJugadorSur(i+1,(n/2)-1,movs);
    	}
    }
    public void ponerExpNorteMov001(int cantidad){
    	int n=this.tablero.getSize();	
    	for(int i=0;i<cantidad;i++){
    		List<Movimiento> movs = generarMovimientosParaMov001N(i+1,cantidad);
    		tablero.ponerJugadorNorte(i+(n-cantidad-1),(n/2)+1,movs);
    	}
    }
    public List<Movimiento> generarMovimientosParaMov001N(int posEnLaBarrera,int integrantes){
    	List<Movimiento> l = new Vector<Movimiento>();
    	int n=this.tablero.getSize();
    	
    	//el ultimo
    	if(posEnLaBarrera==integrantes){
    		agregarNMovimientosHaciaX(integrantes-2, f,l);
    		agregarNMovimientosHaciaX(n-3,o,l);
    	}
    	//el primero
    	if(posEnLaBarrera==1)
    		agregarNMovimientosHaciaX(integrantes-1, e,l);
    	//los del medio
    	else
    	{
    		agregarNMovimientosHaciaX(integrantes-posEnLaBarrera, e,l);
    		agregarNMovimientosHaciaX(integrantes-posEnLaBarrera, f,l);
    		//cambie aca
    		agregarNMovimientosHaciaX(n-2,o,l);
    	}
    	return l;
    }
    public List<Movimiento> generarMovimientosParaMov001S(int posEnLaBarrera,int integrantes){
    	List<Movimiento> l = new Vector<Movimiento>();
    	int n=this.tablero.getSize();
    	
    	//el primero
    	if(posEnLaBarrera==1){
    		agregarNMovimientosHaciaX(integrantes-1, f,l);
    		agregarNMovimientosHaciaX(n-2,e,l);
    	}
    	//el ultimo
    	if(posEnLaBarrera==integrantes)
    		agregarNMovimientosHaciaX(integrantes-1, o,l);
    	//los del medio
    	else
    	{
    		agregarNMovimientosHaciaX(posEnLaBarrera-1, o,l);
    		agregarNMovimientosHaciaX(integrantes-posEnLaBarrera, f,l);
    		agregarNMovimientosHaciaX(n-2,e,l);
    	}
    	return l;
    }
    public List<Movimiento> agregarNMovimientosHaciaX(int cantidad, Movimiento direccion,List<Movimiento> l){
    	for(int i=0;i<cantidad;i++)
    		l.add(direccion);
    	return l;
    }
    
	
}
